// 使用前先引入 defineStore；
import { defineStore } from 'pinia';

//缓存操作
import { getToken, setToken, removeToken, setTKenType, setUser, getUser } from '@/utils/auth';
import { useDictStore } from '@/store/modules/dict';
//API
import publicApi from '@/api';

// defineStore 方法有两个参数，第一个参数是模块化名字（相当于ID，不能重复）
// 第二个参数是选项
export const useUserStore = defineStore('User', {
	// data存放模块的变量
	state() {
		return {
			userInfo: null, //用户数据
			sysParams: null,
			token: getToken(), //token
			exp: null, //过期时间
			menuNavs: [], //所有的菜单权限和按钮全局数据
			userRoutes: [],
			roles: [], //登录账号权限集合（ID集合）
			rolesAll: {}, //全部的权限集合
			NEED_UPDPWD: {}, //是否需要修改密码-首次登录需要修改密码
		};
	},
	//计算属性
	getters: {
		doubleRoles: (state) => {
			return state.roles;
		},
	},
	//methed方法
	actions: {
		// 登录
		toLogin(params) {
			return new Promise((resolve, reject) => {
				
				const { access_token, expires_in, token_type } = {access_token: '12412123', expires_in: new Date().getTime(), token_type: 'Boleky'}
				// 缓存超时时间
				this.exp = expires_in;
				// 缓存token
				setToken(access_token);
				this.token = access_token;
				// 缓存koken类型
				setTKenType(token_type);
				
				resolve();
				
				// publicApi.login.login(params).then((response) => {
				// 	const { access_token, expires_in, token_type } = response.data.token;
				// 	// 缓存超时时间
				// 	this.exp = expires_in;
				// 	// 缓存token
				// 	setToken(access_token);
				// 	this.token = access_token;
				// 	// 缓存koken类型
				// 	setTKenType(token_type);
				// 	//登录成功后获取用户的一些基本信息
				// 	this.getCurrentUserInfo();

				// 	this.NEED_UPDPWD = { isChangePwd: response.data.isChangePwd, msg: response.msg } //判断是否需要修改密码
				// 	resolve();
				// }).catch((error) => {
				// 	reject(error);
				// });
			});
		},
		//获取当前登录用户的一些信息
		getCurrentUserInfo() {
			return new Promise((resolve, reject) => {
				publicApi.login.getInfo().then((response) => {
					const data = response.data || {};
					if (data.userInfo) {
						this.userInfo = data.userInfo;
					}
					if (data.sysParam) {
						this.sysParams = data.sysParam;
					}

					resolve();
				}).catch((error) => {
					reject(error);
				});
			});
		},
		//获取登录账号权限数据
		getLeftMenuNavs() {
			document.getElementById('loader-main').style.display = 'block'; //loading
			return new Promise((resolve, reject) => {
				publicApi.sysMainten.getLeftMenuNavs().then((response) => {
					const data = response.data || [];
					this.menuNavs = data;
					this.roles = this.menuTree(data);
					this.roles = Array.from(new Set(this.roles)); //数组去重

					resolve();
				}).catch((error) => {
					reject(error);
					document.getElementById('loader-main').style.display = 'none'; //loading
				});
			});
		},
		//树目录转成扁平化
		menuTree(data) {
			let result = [];
			for (const item of data) {
				let btns = [];
				//按钮权限
				if (item.BtnList && item.BtnList.length > 0) {
					item.BtnList.forEach((btn) => {
						btns.push({
							btnCode: btn.ItemCode,
							btnName: btn.ItemName,
							btnValue: btn.ItemValue,
							cssCls: btn.CssCls,
							icon: btn.Icon,
							event: btn.EventName,
							types: btn.Types,
						});
					});
				}

				result.push({ id: item.ID, name: item.MenuName, btns }); // 只取当前节点的信息，不包括 children
				if (item.ChildList === null || item.ChildList === undefined) {
					continue;
				}

				let getChildren = this.menuTree(item.ChildList);
				result = result.concat(getChildren);
			}
			return result;
		},
		// 退出登录
		logout() {
			return new Promise((resolve) => {
				publicApi.login.LogOut().then((response) => {
					const dictStore = useDictStore();
					removeToken(); //删除token
					dictStore.$reset();
					this.$reset(); //重置持久化存储的状态
					this.userInfo = null; //清除用户数据
					resolve();
				});
			});
		},
	},
	// 添加 persist 属性，持久化保存
	persist: {
		key: 'userStore', //存储名称
		storage: sessionStorage, // 存储方式
		paths: ['userInfo', 'sysParams', 'exp', 'menuNavs', 'roles', 'NEED_UPDPWD'], //指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态，undefined 或 null 表示持久化整个 state
	},
});